package futbol.tacticas.concursantes.Cascoporro;

import futbol.tacticas.concursantes.Tactica;
import futbol.tacticas.*;

import java.awt.*;
import java.util.Vector;

/**
 * Created by IntelliJ IDEA.
 * User: Alberto Velasco
 * Date: 03-jun-2008
 * Time: 9:49:36
 * 
 */
public class Cascoporro implements Tactica {

    private int fuerzas[]={6,4,5,5,4,5,5,4,4,6,7};

    private Zona[] zonas = new Zona[11];

//    private
    public Cascoporro(){
        zonas[0]=new Zona (-160, -60, -120, 60);
        zonas[1]=new Zona (-160, -120, 0, -50);
        zonas[2]=new Zona (-160, -60, -40, 10);
        zonas[3]=new Zona (-160, 0, -40, 60);
        zonas[4]=new Zona (-160, 50, 0, 120);
        zonas[5]=new Zona (-60, -80, 10, 60);
        zonas[6]=new Zona (-10, -60, 80, 60);
        zonas[7]=new Zona (-10, -120, 160, -50);
        zonas[8]=new Zona (0, 50, 160, 120);
        zonas[9]=new Zona (40, -60, 160, 10);
        zonas[10]=new Zona (40, 0, 160, 60);
    }

    public String getNombre() {
        return "Cascoporro CF";  //To change body of implemented methods use File | Settings | File Templates.
    }

    public Color getColor1() {
        return Color.WHITE;  //To change body of implemented methods use File | Settings | File Templates.
    }

    public Color getColor2() {
        return Color.BLACK;  //To change body of implemented methods use File | Settings | File Templates.
    }

    public Color getColorNumero() {
        return Color.RED;  //To change body of implemented methods use File | Settings | File Templates.
    }

    public int getXInicial(int n) {
        Point p = zonas[n].getCentro();
        return p.x;
    }

    public int getYInicial(int n) {
        Point p = zonas[n].getCentro();
        return p.y;
    }

    public int getFuerza(int n) {
        return fuerzas[n];
    }
    public Vector<Comando> getComandos(SituacionJugadores sj) {

        Vector<Comando> com=new Vector<Comando>();
        //Posicionamiento
        for (int n=0;n<11;n++){
            Point p = zonas[n].getCentro();
            com.add(new ComandoIrA(n,p.x,p.y));
        }
        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();

        //Movimiento portero
        if(zonas[0].estaDentro(bola))
            com.add(new ComandoIrA(0,bola.x, bola.y));
        else{
            int y=(int)(bola.getY()/2);
            if (y<-20) y=-20;
            if (y>20) y=20;
            com.add(new ComandoIrA(0,-150, y));
        }

        // Recorro zonas para el resto
        for(int n=1;n<11;n++){
            if(zonas[n].estaDentro(bola))
                com.add(new ComandoIrA(n,bola.x, bola.y));
        }

        // Golpeos
        int mejorHeur=Integer.MAX_VALUE;
        int mejorJug=10;

        // Recorro zonas para todos menos los delanteros
        for(int n=0;n<9;n++){
            for(int j=n+1; j<11; j++){
                    int heur = heuristicaPase(n,j,sj);
                    if(heur<mejorHeur)
                        mejorJug=j;
            }
            com.add(new ComandoGolpearBola(n, jugadores[mejorJug].x, jugadores[mejorJug].y));
        }

        // delanteros
        for(int n=9;n<11;n++)
            if(jugadores[n].y >= 0)
                com.add(new ComandoTiroAPuerta(n, -5));
            else
                com.add(new ComandoTiroAPuerta(n, 5));

        return com;
    }

    int heuristicaPase (int nOrigen, int nDestino, SituacionJugadores sj)
    {
        int heur=0;

        int con = sj.getContrarioMasCerca(nDestino);

        if(!zonas[nDestino].estaDentro(sj.getContrario()[con]))
            return 1;//heur += 1;

        heur += (int) distancia(sj.getMisJugadores()[nDestino],sj.getMisJugadores()[nOrigen]);

        return heur;
    }

    private double distancia(Point p1, Point p0){
        double dx=(p1.x-p0.x);
        double dy=(p1.y-p0.y);
        return Math.sqrt(dx*dx+dy*dy);
    }

}
